package com.spring.redis.operation.service;

import com.spring.redis.operation.service.base.ListRedisBaseService;

import java.util.List;

/**
 * @author zhouyu
 */
public interface ListRedisService extends ListRedisBaseService {

    /**
     * 通过索引 获取list中的值
     *
     * @param className 类名称
     * @param key       键
     * @param index     索引 index>0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推
     * @return java.lang.Object
     */
    Object get(String className, String key, Long index);

    /**
     * 通过索引 获取list中的值
     *
     * @param clazz 类名称
     * @param key   键
     * @param index 索引 index>0时， 0 表头，1 第二个元素，依次类推；index<0时，-1，表尾，-2倒数第二个元素，依次类推
     * @return java.lang.Object
     */
    Object get(Class<?> clazz, String key, Long index);

    /**
     * 获取list缓存的内容
     *
     * @param className 类名称
     * @param key       键
     * @param start     开始
     * @param end       结束 0 到 -1代表所有值
     * @return java.util.List<Object>
     */
    List<Object> get(String className, String key, Long start, Long end);

    /**
     * 获取list缓存的内容
     *
     * @param clazz 类名称
     * @param key   键
     * @param start 开始
     * @param end   结束 0 到 -1代表所有值
     * @return java.util.List<Object>
     */
    List<Object> get(Class<?> clazz, String key, Long start, Long end);

    /**
     * 获取所有list元素
     *
     * @param className 类名称
     * @param key       key
     * @return java.util.List<Object>
     */
    List<Object> getAll(String className, String key);

    /**
     * 获取所有list元素
     *
     * @param clazz 类名称
     * @param key   key
     * @return java.util.List<Object>
     */
    List<Object> getAll(Class<?> clazz, String key);

    /**
     * 获取list缓存的长度
     *
     * @param className 类名称
     * @param key       键
     * @return java.lang.Long list长度
     */
    Long size(String className, String key);

    /**
     * 获取list缓存的长度
     *
     * @param clazz 类名称
     * @param key   键
     * @return java.lang.Long list长度
     */
    Long size(Class<?> clazz, String key);

    /**
     * 将list放入缓存
     *
     * @param className 类名称
     * @param key       键
     * @param value     值
     * @return java.lang.Long
     */
    Long add(String className, String key, Object value);

    /**
     * 将list放入缓存
     *
     * @param clazz 类名称
     * @param key   键
     * @param value 值
     * @return java.lang.Long
     */
    Long add(Class<?> clazz, String key, Object value);

    /**
     * 将list放入缓存
     *
     * @param className 类名称
     * @param key       键
     * @param value     值
     * @param time      时间(秒)
     * @return java.lang.Long
     */
    Long add(String className, String key, Object value, Long time);

    /**
     * 将list放入缓存
     *
     * @param clazz 类名称
     * @param key   键
     * @param value 值
     * @param time  时间(秒)
     * @return java.lang.Long
     */
    Long add(Class<?> clazz, String key, Object value, Long time);

    /**
     * 将list放入缓存
     *
     * @param className 类名称
     * @param key       键
     * @param values    值
     * @return java.lang.Long
     */
    Long addAll(String className, String key, List<Object> values);

    /**
     * 将list放入缓存
     *
     * @param clazz  类名称
     * @param key    键
     * @param values 值
     * @return java.lang.Long
     */
    Long addAll(Class<?> clazz, String key, List<Object> values);

    /**
     * 将list放入缓存
     *
     * @param className 类名称
     * @param key       键
     * @param values    值
     * @param time      时间(秒)
     * @return java.lang.Long
     */
    Long addAll(String className, String key, List<Object> values, Long time);

    /**
     * 将list放入缓存
     *
     * @param clazz  类名称
     * @param key    键
     * @param values 值
     * @param time   时间(秒)
     * @return java.lang.Long
     */
    Long addAll(Class<?> clazz, String key, List<Object> values, Long time);

    /**
     * 根据索引修改list中的某条数据
     *
     * @param className 类名称
     * @param key       键
     * @param index     索引
     * @param value     值
     */
    void update(String className, String key, Long index, Object value);

    /**
     * 根据索引修改list中的某条数据
     *
     * @param clazz 类名称
     * @param key   键
     * @param index 索引
     * @param value 值
     */
    void update(Class<?> clazz, String key, Long index, Object value);

    /**
     * 移除N个值为value
     *
     * @param className 类名称
     * @param key       键
     * @param count     移除多少个
     * @param value     值
     * @return java.lang.Long 移除的个数
     */
    Long remove(String className, String key, Long count, Object value);

    /**
     * 移除N个值为value
     *
     * @param clazz 类名称
     * @param key   键
     * @param count 移除多少个
     * @param value 值
     * @return java.lang.Long 移除的个数
     */
    Long remove(Class<?> clazz, String key, Long count, Object value);

    /**
     * 移除所有
     *
     * @param className className
     * @param key       key
     */
    void removeAll(String className, String key);

    /**
     * 移除所有
     *
     * @param clazz clazz
     * @param key   key
     */
    void removeAll(Class<?> clazz, String key);

    /**
     * 返回和移除列表的第一个元素
     * @param className className
     * @param key       key
     * @return Object
     */
    Object lPop(String className, String key);

    /**
     * 返回和移除列表的第一个元素
     * @param clazz clazz
     * @param key   key
     * @return Object
     */
    Object lPop(Class<?> clazz, String key);
}
